// 这个函数用来产生一个任务
function timeout(time){
    // 在time时间后完成这个promise
    return new Promise(resolve=>{
        setTimeout(resolve,time)
    })
}

// 并发器
class SuperTask{
    constructor(parallelCount=2){
        this.parallelCount=parallelCount  // 任务最大并发数
        this.tasks=[]    // 正在排队的任务
        this.runningCount=0     // 正在执行的任务数量
    }
    add(task){   // 添加一个任务到排队队列中
        return new Promise((resolve,reject)=>{
            this.tasks.push({
                task,
                resolve,
                reject
            })

            // 此时需要尝试执行该任务
            this.runTask()
        })
    }
    runTask(){   // 执行任务
        while(this.runningCount<this.parallelCount&&this.tasks.length){  // 没有超过最大并发数且有任务在排队才执行
            this.runningCount++
            const {task,resolve,reject}=this.tasks.shift()  // 取出一个任务来执行
            task().then(resolve,reject) // 任务执行完毕时，让add返回的promise变成完成状态
                .finally(()=>{
                    this.runningCount--  // 正在执行的任务数-1
                    this.runTask()  // 通知下一个任务来执行
                })
        }
    }
}

const superTask=new SuperTask()
function addTask(time,name){
    superTask
        .add(()=>timeout(time))  // 添加一个任务
        .then(()=>{  // 这里的then什么时候执行？add返回的promise完成时执行
            console.log(`任务${name}完成`);
        })
}

addTask(10000,1) // 10秒后输出：任务1完成
addTask(5000,2) //  5秒后输出：任务2完成
addTask(3000,3) //  8秒后输出：任务3完成
addTask(4000,4) // 12秒后输出：任务4完成
addTask(5000,5) // 15秒后输出：任务5完成